iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
自我挑戰組

golang 後端菜雞工程師學習雜記系列 第 2

Day2 理解 golang slice 用法及原理 II

  • 分享至 

  • xImage
  •  

續上篇 Day1 理解 golang slice 用法及原理 I

什麼是 slice 是的容量 (capbility,也就是上篇所提的 cap),跟長度有什麼關係 (length)?
打個比方,有一瓶礦泉水,礦泉水最多能容納 600cc,但是實際上只裝有 300cc 的水。大概就是這種感覺。

創建 slice 語法 III

s := make([]int, 3, 5)

make 創建了個型態為 int 長度為 5 的 underlying array,並且用一個名為 s 的 slice 描述了從第零個元素到第三個元素的片段。

最後一個創建方式

s := make([]int, 3)

其實就創建一個長度為 3 的 underlying array,並且使用 s 描述這一整段 array,有就是說 len(s) 等於 cap(s)。

這麼說 slice 是能伸縮的?

眾所皆知 array 是不能伸縮的,underlying array 也是 array,所以 array 不能伸縮。但是 slice 可以透過 slice header 的長度的更改就輕易達到了伸縮的效果。

slice 最常看見的語法就是用分號取一小個片段,所以 slice 能縮小是確定的。
但是 slice 能伸長嗎?答案是可以的。

s := make([]int, 3, 5)
s = s[:len(s) + 1]

沒錯,你沒看錯,這段程式是不會 panic 的。還記得礦泉水的例子嗎,水沒裝滿當然能繼續裝啊,只要不裝超過容量就行。同理,這段程式,s 只要伸張不超過容量就不會 panic。

但是這段程式是為了觀念所寫,除非有什麼特定場景,不然沒事千萬別這樣幹。如果覺得 slice 長度不夠,大多數情況下用 append 函式解決,後面幾張也會提到 append 是怎麼做的。

文章索引


上一篇
Day1 理解 golang slice 用法及原理 I
下一篇
Day3 理解 golang slice 用法及原理 III
系列文
golang 後端菜雞工程師學習雜記18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言